javascript oop、instanceof 和基类
全部标签 interfaceIBase{stringName{get;}}classBase:IBase{publicBase()=>this.Name="Base";publicstringName{get;}}classDerived:Base//,IBase{publicDerived()=>this.Name="Derived";publicnewstringName{get;}}classProgram{staticvoidMain(string[]args){IBaseo=newDerived();Console.WriteLine(o.Name);}}在这种情况下,输出将为“Bas
ClassA{}ClassB:A{}BItemB=newB();AItemA=(A)B;Console.WriteLine(ItemA.GetType().FullName);是否可以像上面那样做一些事情并让编译器打印出类型A而不是类型B。基本上,是否可以永久转换对象以使其“丢失”所有派生数据? 最佳答案 您所要求的是不可能的,原因有二:ItemA.GetType()不返回变量ItemA的编译时类型-它返回运行时类型ItemA引用的对象。您无法使(A)B导致表示更改转换(即新的A对象),因为用户定义的转换运算符(您唯一的希望在这里)
我有两个类(MVCView模型)继承自一个抽象基类。abstractclassBaseModel{}classCar:BaseModel{publicstringSpeed{get;set;}}classCamper:BaseModel{publicintBeds{get;set;}}并希望使用基类配置AutoMapper,例如:Mapper.CreateMap();varsomeObj=newDataDastination();Mapper.Map(instanceOfBaseModel,someObj);这里我得到错误,因为Automapper没有Car或Camper的配置。尝试用
在C#中,如何在事先不知道类型的情况下使用XmlSerializer反序列化可能属于基类或任何派生类的对象?我的所有派生类都添加了额外的数据成员。我制作了一个简单的GUI,可以序列化和反序列化类对象。它会根据用户选择填充的字段将对象序列化为合适的继承类(甚至只是基类)。我对序列化没有任何问题;问题是反序列化。在事先不知道类的情况下,我怎么可能让XmlSerializer将数据反序列化为正确的派生类?我目前创建了一个XmlReader来读取XML文件的第一个节点并从中确定类,它似乎适合我的目的,但它似乎是一个非常不优雅的解决方案。我在下面发布了一些示例代码。有什么建议吗?BaseType
声明一个记录器并在基类中调用LogManager.GetLogger似乎更干净,这样每个继承人都可以使用它。但是,在log4net站点和其他博客上,如thisblogpost它声明最好为每个类声明一个记录器,因为:Youcanuseloggersthiswaytoisolateloggingconcernsacrossyourobjects,andIwhollyrecommendyoudoso.Thiswillenableyoutothrottleanddirectlogoutputfromindividualloggersusinglog4net'shierarchicalconfi
在调试session期间,在特定实例的调试信息中识别实际派生类的名称对我来说很重要。我尝试使用this.GetType().Name但这只会返回base类的类型。有没有一种简单的方法可以从基类中获取派生类的类型? 最佳答案 this.GetType().Name应该有效。我认为,就您而言,您可能没有派生类。如果它返回基类名称,则它不应该有派生类。使用这个:基类-输出基类名称派生类-输出派生类名派生类转换为基类-输出派生类名派生类传递给接受基类作为参数的函数-输出派生类名 关于C#从内部基
如果我编写一个接受派生自BaseClass(或接口(interface))的参数的方法,据我所知有两种方法可以实现:voidMyMethod(Tobj)whereT:BaseClass{...}和voidMyMethod(BaseClassobj){...}这两种方法有什么区别? 最佳答案 在此示例中,两者之间没有太大区别,您可以在方法内部访问相同的成员,并且可以使用相同的派生类调用它。存在运行时差异,因为泛型方法是针对调用它的每种类型进行编译的。如果您根据T返回一个值,泛型就会派上用场使用泛型你可以做以下事情TMyMethod(T
这不会编译:namespaceConstructor0Args{classBase{publicBase(intx){}}classDerived:Base{}classProgram{staticvoidMain(string[]args){}}}相反,我收到以下错误:'Constructor0Args.Base'doesnotcontainaconstructorthattakes0arguments这是为什么呢?基类有必要有一个0参数的构造函数吗? 最佳答案 它不是-问题是它需要调用一些基础构造函数,以初始化基础类型和默认就是
classFlarg{privatereadonlyActionspeak;publicActionSpeak{get{returnspeak;}}publicFlarg(Actionspeak){this.speak=speak;}}classMuteFlarg:Flarg{publicMuteFlarg():base(GiveDumbLook){}privatevoidGiveDumbLook(){}}编译器给出错误“非静态字段、方法或属性‘Project.Namespace.Class.GiveDumbLook’需要一个对象。这似乎与将Action作为参数传递给任何其他方法没有什
我想使用反射将所有属性从MyObject更新到另一个。我遇到的问题是特定对象是从基类继承的,并且这些基类属性值未更新。以下代码复制顶级属性值。publicvoidUpdate(MyObjecto){MyObjectcopyObject=...FieldInfo[]myObjectFields=o.GetType().GetFields(BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance);foreach(FieldInfofiinmyObjectFields){fi.SetValue(copyObject,f